package com.liyuci.core.helper;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.persistence.Transient;

/**
 * JPA反射工具类
 * @author liyuci
 * @date 2018-02-05 16:52:40
 */

public class JpaReflectHelper {

	/**
	 * 判断是否存在
	 * @author liyuci
	 * @date 2018-02-05 16:54:29
	 * @param clazz
	 * @param fieldName
	 * @return
	 */
	public static boolean modelIsExistField(Class<?> clazz, String fieldName)
	{
		//1、类属否存在该属性
		//获取类中所有字段，有些方法定义在父类中而且只能获取public字段
		Map<String, Field> fieldNameAndFieldMap = new HashMap<>();
		//返回包括父类的所有的public字段
		Field[] arrSupperField = clazz.getFields();
		//返回类所有声明的字段，包括private、protected、public，但是不包括父类的
		Field[] arrField = clazz.getDeclaredFields();
		for(Field field : arrSupperField)
		{
			fieldNameAndFieldMap.put(field.getName(), field);
		}
		for(Field field : arrField)
		{
			fieldNameAndFieldMap.put(field.getName(), field);
		}
		
		//2、判断属性是否存在
		if(fieldNameAndFieldMap.containsKey(fieldName))
		{
			Field field = fieldNameAndFieldMap.get(fieldName);
			//属性的注解
			Annotation[] arrAnnotation = field.getAnnotations();
			//所有的注解类型名称信息
			Set<String> annotationTypeNameSet = new HashSet<>();
			for(Annotation annotation : arrAnnotation)
			{
				annotationTypeNameSet.add(annotation.annotationType().getSimpleName());
			}
			//是否包含“@Transient”不持久化的注解
			if(!annotationTypeNameSet.contains(Transient.class.getSimpleName()))
			{
				return true;
			}
		}
		return false;
	}
}
